<!DOCTYPE html>
<style>
#alignSelfBaseline {
    align-self: baseline;
}

#alignSelfFirstBaseline {
    align-self: first baseline;
}

#alignSelfLastBaseline {
    align-self: last baseline;
}

#alignSelfStretch {
    align-self: stretch;
}

#alignSelfNormal {
    align-self: normal;
}

#alignSelfStart {
    align-self: start;
}

#alignSelfEnd {
    align-self: end;
}

#alignSelfCenter {
    align-self: center;
}

#alignSelfSelfStart {
    align-self: self-start;
}

#alignSelfSelfEnd {
    align-self: self-end;
}

#alignSelfFlexStart {
    align-self: flex-start;
}

#alignSelfFlexEnd {
    align-self: flex-end;
}

#alignSelfUnsafeEnd {
    align-self: unsafe end ;
}

#alignSelfUnsafeCenter {
    align-self: unsafe center ;
}

#alignSelfSafeSelfEnd {
    align-self: safe self-end;
}

#alignSelfSafeSelfStart {
    align-self: safe self-start;
}

#alignSelfUnsafeFlexStart {
    align-self: unsafe flex-start;
}

#alignSelfSafeFlexEnd {
    align-self: safe flex-end;
}
</style>
<p>Test that setting and getting align-self works as expected</p>
<div id="alignSelfBaseline"></div>
<div id="alignSelfFirstBaseline"></div>
<div id="alignSelfLastBaseline"></div>
<div id="alignSelfStretch"></div>
<div id="alignSelfNormal"></div>
<div id="alignSelfStart"></div>
<div id="alignSelfEnd"></div>
<div id="alignSelfCenter"></div>
<div id="alignSelfSelfStart"></div>
<div id="alignSelfSelfEnd"></div>
<div id="alignSelfFlexStart"></div>
<div id="alignSelfFlexEnd"></div>

<div id="alignSelfUnsafeEnd"></div>
<div id="alignSelfUnsafeCenter"></div>
<div id="alignSelfSafeSelfEnd"></div>
<div id="alignSelfSafeSelfStart"></div>
<div id="alignSelfUnsafeFlexStart"></div>
<div id="alignSelfSafeFlexEnd"></div>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="resources/alignment-parsing-utils-th.js"></script>
<script>
test(function() {
    var alignSelfBaseline = document.getElementById("alignSelfBaseline");
    checkValues(alignSelfBaseline, "alignSelf", "align-self", "", "baseline");
    var alignSelfFirstBaseline = document.getElementById("alignSelfFirstBaseline");
    checkValues(alignSelfFirstBaseline, "alignSelf", "align-self", "", "baseline");
    var alignSelfLastBaseline = document.getElementById("alignSelfLastBaseline");
    checkValues(alignSelfLastBaseline, "alignSelf", "align-self", "", "last baseline");
    var alignSelfStretch = document.getElementById("alignSelfStretch");
    checkValues(alignSelfStretch, "alignSelf", "align-self", "", "stretch");
    var alignSelfNormal = document.getElementById("alignSelfNormal");
    checkValues(alignSelfNormal, "alignSelf", "align-self", "", "normal");
    var alignSelfStart = document.getElementById("alignSelfStart");
    checkValues(alignSelfStart, "alignSelf", "align-self", "", "start");
    var alignSelfEnd = document.getElementById("alignSelfEnd");
    checkValues(alignSelfEnd, "alignSelf", "align-self", "", "end");
    var alignSelfCenter = document.getElementById("alignSelfCenter");
    checkValues(alignSelfCenter, "alignSelf", "align-self", "", "center");
    var alignSelfSelfEnd = document.getElementById("alignSelfSelfEnd");
    checkValues(alignSelfSelfEnd, "alignSelf", "align-self", "", "self-end");
    var alignSelfSelfStart = document.getElementById("alignSelfSelfStart");
    checkValues(alignSelfSelfStart, "alignSelf", "align-self", "", "self-start");
    var alignSelfFlexStart = document.getElementById("alignSelfFlexStart");
    checkValues(alignSelfFlexStart, "alignSelf", "align-self", "", "flex-start");
    var alignSelfFlexEnd = document.getElementById("alignSelfFlexEnd");
    checkValues(alignSelfFlexEnd, "alignSelf", "align-self", "", "flex-end");

    var alignSelfUnsafeEnd = document.getElementById("alignSelfUnsafeEnd");
    checkValues(alignSelfUnsafeEnd, "alignSelf", "align-self", "", "unsafe end");
    var alignSelfUnsafeCenter = document.getElementById("alignSelfUnsafeCenter");
    checkValues(alignSelfUnsafeCenter, "alignSelf", "align-self", "", "unsafe center");
    var alignSelfSafeSelfEnd = document.getElementById("alignSelfSafeSelfEnd");
    checkValues(alignSelfSafeSelfEnd, "alignSelf", "align-self", "", "safe self-end");
    var alignSelfSafeSelfStart = document.getElementById("alignSelfSafeSelfStart");
    checkValues(alignSelfSafeSelfStart, "alignSelf", "align-self", "", "safe self-start");
    var alignSelfUnsafeFlexStart = document.getElementById("alignSelfUnsafeFlexStart");
    checkValues(alignSelfUnsafeFlexStart, "alignSelf", "align-self", "", "unsafe flex-start");
    var alignSelfSafeFlexEnd = document.getElementById("alignSelfSafeFlexEnd");
    checkValues(alignSelfSafeFlexEnd, "alignSelf", "align-self", "", "safe flex-end");
}, "Test getting align-self set through CSS.");

test(function() {
    element = document.createElement("div");
    document.body.appendChild(element);
    checkValues(element, "alignSelf", "align-self", "", "auto");
}, "Test initial value of align-self through JS");

test(function() {
    container = document.createElement("div");
    element = document.createElement("div");
    container.appendChild(element);
    document.body.appendChild(container);
    element.style.alignSelf = "center";
    checkValues(element, "alignSelf", "align-self",  "center", "center");

    element.style.alignSelf = "unsafe start";
    checkValues(element, "alignSelf", "align-self",  "unsafe start", "unsafe start");

    element.style.alignSelf = "safe flex-end";
    checkValues(element, "alignSelf", "align-self",  "safe flex-end", "safe flex-end");

    element.style.alignSelf = "center";
    checkValues(element, "alignSelf", "align-self",  "center", "center");

    element.style.alignSelf = "self-start";
    checkValues(element, "alignSelf", "align-self",  "self-start", "self-start");

    element.style.alignSelf = "normal";
    checkValues(element, "alignSelf", "align-self",  "normal", "normal");

    element.style.alignSelf = "auto";
    checkValues(element, "alignSelf", "align-self",  "auto", "auto");

    container.style.display = "flex";
    element.style.alignSelf = "auto";
    checkValues(element, "alignSelf", "align-self",  "auto", "auto");

    container.style.display = "grid";
    element.style.alignSelf = "auto";
    checkValues(element, "alignSelf", "align-self",  "auto", "auto");

    element.style.alignSelf = "self-end";
    checkValues(element, "alignSelf", "align-self",  "self-end", "self-end");
}, "Test getting and setting align-self through JS");

test(function() {
    document.documentElement.style.alignSelf = "auto";
    checkValues(document.documentElement, "alignSelf", "align-self",  "auto", "auto");
}, "Test 'auto' value resolution for the root node");

test(function() {
    container = document.createElement("div");
    element = document.createElement("div");
    container.appendChild(element);
    document.body.appendChild(container);

    checkBadValues(element, "alignSelf", "align-self",  "left");
    checkBadValues(element, "alignSelf", "align-self",  "right");
    checkBadValues(element, "alignSelf", "align-self",  "safe auto");
    checkBadValues(element, "alignSelf", "align-self",  "auto left");
    checkBadValues(element, "alignSelf", "align-self",  "safe right");
    checkBadValues(element, "alignSelf", "align-self",  "normal unsafe");
    checkBadValues(element, "alignSelf", "align-self",  "normal stretch");
    checkBadValues(element, "alignSelf", "align-self",  "baseline normal");
    checkBadValues(element, "alignSelf", "align-self",  "baseline safe");
    checkBadValues(element, "alignSelf", "align-self",  "baseline center");
    checkBadValues(element, "alignSelf", "align-self",  "first baseline center");
    checkBadValues(element, "alignSelf", "align-self",  "last baseline center");
    checkBadValues(element, "alignSelf", "align-self",  "baseline last");
    checkBadValues(element, "alignSelf", "align-self",  "baseline first");
    checkBadValues(element, "alignSelf", "align-self",  "stretch unsafe");
    checkBadValues(element, "alignSelf", "align-self",  "stretch right");
    checkBadValues(element, "alignSelf", "align-self",  "unsafe unsafe");
    checkBadValues(element, "alignSelf", "align-self",  "unsafe safe");
    checkBadValues(element, "alignSelf", "align-self",  "center start");
    checkBadValues(element, "alignSelf", "align-self",  "stretch unsafe");
    checkBadValues(element, "alignSelf", "align-self",  "safe stretch");
    checkBadValues(element, "alignSelf", "align-self",  "baseline safe");
    checkBadValues(element, "alignSelf", "align-self",  "unsafe baseline");
    checkBadValues(element, "alignSelf", "align-self",  "unsafe safe left");
    checkBadValues(element, "alignSelf", "align-self",  "unsafe left safe");
    checkBadValues(element, "alignSelf", "align-self",  "left safe unsafe safe");
    checkBadValues(element, "alignSelf", "align-self",  "legacy start");
    checkBadValues(element, "alignSelf", "align-self",  "legacy end");
    checkBadValues(element, "alignSelf", "align-self",  "legacy right unsafe");
    checkBadValues(element, "alignSelf", "align-self",  "legacy auto");
    checkBadValues(element, "alignSelf", "align-self",  "legacy stretch");
    checkBadValues(element, "alignSelf", "align-self",  "legacy");
    checkBadValues(element, "alignSelf", "align-self",  "legacy left right");
    checkBadValues(element, "alignSelf", "align-self",  "start safe");
    checkBadValues(element, "alignSelf", "align-self",  "end unsafe");
}, "Test bad combinations of align-self");

test(function() {
    container.style.display = "";
    checkInitialValues(element, "alignSelf", "align-self", "center", "auto");
}, "Test the value 'initial'");

test(function() {
    container.style.display = "grid";
    checkInitialValues(element, "alignSelf", "align-self", "safe start", "auto");
}, "Test the value 'initial' for grid containers");

test(function() {
    container.style.display = "flex";
    checkInitialValues(element, "alignSelf", "align-self", "unsafe end", "auto");
}, "Test the value 'initial' for flex containers");

test(function() {
    container.style.display = "";
    element.style.position = "absolute";
    checkInitialValues(element, "alignSelf", "align-self", "start", "auto");
}, "Test the value 'initial' for positioned elements");

test(function() {
    container.style.display = "grid";
    element.style.position = "absolute";
    checkInitialValues(element, "alignSelf", "align-self", "end", "auto");
}, "Test the value 'initial' for positioned elements in grid containers");

test(function() {
    container.style.display = "flex";
    element.style.position = "absolute";
    checkInitialValues(element, "alignSelf", "align-self", "end", "auto");
}, "Test the value 'initial' for positioned elements in flex containers");

test(function() {
    checkInheritValues("alignSelf", "align-self", "end");
    checkInheritValues("alignSelf", "align-self", "safe start");
    checkInheritValues("alignSelf", "align-self", "unsafe center");
}, "Test the value 'inherit'");
</script>
